<?php
/**
 * Класс предоставляет базовый функционал для управления всеми сущностями
 * @author Dmitriev A.S.
 */
abstract class Default_Model_Managers_EntityManagerAbstract
{
	/**
	 * Объект для работы с данными конкретной сущности.
	 * Должен задаваться в конструкторе наследника
	 * @var Zend_Db_Table_Abstract
	 */
	protected $_dbTable;
	
	/**
	 * Метод передает данные о сущности объекту, работающиму с БД
	 * @param array $data данные будущей сущности
	 * @return bool
	 * @TODO: У случае неудачи должно возвращаться сообщение об ошибке
	 */
	public function addEntity(array $data)
	{
        if ($this->_dbTable->addEntity($data)){
        	return true;
        }
        return false;
	}
	
	/**
	 * Удаляет сущность со всеми версиями
	 * @param int $id Идентификатор сущности
	 * @return int количество затронутых строк
	 */
    public function deleteEntity($id, $value = 1)
	{
		return $this->_dbTable->deleteEntity($id, $value);
	}
	
	/**
	 * Обновляет в сущности только те данные, которые переданы в массиве $data
	 * На самом деле происходит не обновление, а создание
	 * измененной копии сущности с новым номерои версии
	 * @param int $id идентификатор сущности
	 * @param array $data данные, которые необходимо обновить
	 * @return bool
	 */
    public function updateEntity($id, $newData)
	{
		$entity = $this->_dbTable->getEntityById($id);
		$entity->version = ++$entity->version;
		$data = $entity->toArray();
		$info = $this->_dbTable->info();
		unset($data[$info['primary'][1]]);
		//TODO: Сделать проверку на соответствие ключей массива, а то мерджим неизвестно что
		$result = array_merge($data, $newData);
        return $this->_dbTable->updateEntity($id, $result);
	}
	
	/**
	 * Метод возвращает объект сущности, соответствующий номеру версии.
	 * Если номер версии не указан, то возвращается последняя версия
	 * @param int $id Идентификатор сущности
	 * @param int $version Номер версии сущности
	 * @return Default_Model_Entities_EntityAbstract|false
	 */
    public function getEntityById($id, $version = 0)
	{
		return $this->_dbTable->getEntityById($id, $version);
	}
	
	/**
	 * Возвращает массив, содержащий список версий сущности
	 * $id int Идентификатор сущности
	 * @return array|false
	 */
    public function getEntityVersions($id)
	{
		
	}
	
	/**
	 * Получает историю по данному типу сущности за последний месяц
	 * @return array
	 */
    public function getHistory()
	{
		
	}
}